package tum0r.webengine.config

import tum0r.webengine.core.handle.AfterResponse
import tum0r.webengine.core.handle.Filter
import tum0r.webengine.models.core.StaticResource
import tum0r.webengine.models.device.DeviceInfo
import tum0r.webengine.models.mapping.*
import java.awt.Font
import java.io.File
import java.util.concurrent.LinkedBlockingQueue
import java.util.concurrent.ThreadPoolExecutor
import java.util.concurrent.TimeUnit

/**
 * 说明: 服务器配置
 *
 * 创建者: tum0r
 *
 * 时间: 2021/8/18 22:37
 */
class ApplicationConfig {

    /**
     * 服务器配置类伴生对象
     */
    companion object {
        /**
         * 封禁IP列表
         */
        val BAN_IP = ArrayList<String>()

        /**
         * 框架内置字体
         */
        var FONT: Font = Font.createFont(Font.TRUETYPE_FONT, this::class.java.classLoader.getResourceAsStream("Meslo LG M Bold for Powerline.ttf"))!!.deriveFont(Font.BOLD, 80.toFloat())!!

        /**
         * 网站图标
         */
        val ICONS = ArrayList<IconMapping>(3)

        /**
         * 服务器名称，默认为工作目录的名称
         */
        var SERVER_NAME: String

        /**
         * 服务器运行端口
         */
        var SERVER_PORT = 48264

        /**
         * 扫描接口的包路径
         */
        var SCAN_SERVERS_PACKAGE = ""

        /**
         * 扫描命令的包路径
         */
        var SCAN_COMMANDS_PACKAGE = ""

        /**
         * 扫描数据库表的包路径
         */

        var SCAN_TABLES_PACKAGE = ""

        /**
         * 请求接口映射信息
         */
        val SERVER_MAPPINGS = ArrayList<ServerMapping>()

        /**
         * 请求接口类的实例化对象
         */
        val SERVER_OBJECTS = ArrayList<Any>()

        /**
         * 请求接口的参数信息
         */
        val SERVER_METHOD_PARAMETERS_MAPPING = ArrayList<MethodParameterMapping>()

        /**
         * 服务器命令映射信息
         */
        val COMMAND_MAPPINGS = ArrayList<CommandMapping>()

        /**
         * 服务器命令类的实例化对象
         */
        val COMMAND_OBJECTS = ArrayList<Any>()

        /**
         * 数据库表映射
         */
        val TABLE_MAPPINGS = ArrayList<TableMapping>()

        /**
         * 静态资源路径
         */
        val STATIC_RESOURCES = ArrayList<StaticResource>()

        /**
         * 上传文件保存路径
         */
        var UPLOADS_DIR = File("uploads")

        /**
         * 请求过滤
         */
        val FILTERS = ArrayList<Filter>()

        /**
         * 返回请求后需要执行的方法
         */
        val AFTER_RESPONSE = ArrayList<AfterResponse>()

        /**
         * 线程池，每个请求使用一个线程处理
         *
         * 核心线程数；最大线程数，当核心线程不够时自动扩充；除核心线程外的多余线程多久没有任务时会销毁；线程销毁时间单位；所有线程都被占用时任务队列
         */
        val THREAD_POOL: ThreadPoolExecutor = ThreadPoolExecutor(DeviceInfo.getInstance().cpuNumber, DeviceInfo.getInstance().cpuNumber * 2, 10L, TimeUnit.SECONDS, LinkedBlockingQueue())

        /**
         * 请求地址替换正则
         */
        val regexRequestURL = Regex("/{2,}")

        init {
            val projectName = System.getProperty("user.dir")
            SERVER_NAME = projectName.substring(projectName.lastIndexOf(File.separator) + 1)

            // 设置网站图片
            ICONS.add(IconMapping(null, "/apple-touch-icon.png", "logo.png"))
            ICONS.add(IconMapping(null, "/apple-touch-icon-precomposed.png", "logo.png"))
            ICONS.add(IconMapping(null, "/favicon.ico", "logo.ico"))
        }
    }
}